#include <iostream>

// 通用模板
template<typename... Args>
class Tuple {};

// 单一类型特化
// 适用于只有一个类型参数的情况，可以是任何类型
template<typename T>
class Tuple<T> {
    T value;  // 存储单一数据
public:
    Tuple(T v) : value(v) {}
    T getValue() const { return value; }  // 获取存储的值
};

// 偏特化版本，用于处理多个类型的参数
// 第一个参数固定为任意类型T，后续参数可以是任意类型（通过Args...表示）
template<typename T, typename... Args>
class Tuple<T, Args...> {
    T head;  // 存储第一个参数
    Tuple<Args...> tail;  // 递归存储后续参数
public:
    Tuple(T h, Args... t) : head(h), tail(t...) {}
    T getHead() const { return head; }  // 获取头部数据
    auto getTail() const -> const Tuple<Args...>& { return tail; }  // 获取尾部的Tuple
};

int main() {
    // 使用完全特化版本创建只含int的Tuple
    Tuple<int> myIntTuple(10);
    std::cout << "Value in Tuple<int>: " << myIntTuple.getValue() << std::endl;

    // 使用偏特化版本创建含int和double的Tuple
    Tuple<int, double> myIntDoubleTuple(20, 3.14);
    std::cout << "Head in Tuple<int, double>: " << myIntDoubleTuple.getHead() << std::endl;
    std::cout << "Tail value in Tuple<int, double>: " << myIntDoubleTuple.getTail().getValue() << std::endl;

    return 0;
}